iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

C++ AI 起步:編程進入智能世界系列 第 31

遊戲AI 演算法:回溯法- 老鼠走迷宮

  • 分享至 

  • xImage
  •  

回溯法是一種試錯的策略,用於解決計算問題,尤其是優化問題。它嘗試不同的解決方案,直到找到一個有效的解決方案。在本文中,我們將介紹如何使用回溯法來解決遊戲中的問題,特別是老鼠走迷宮的問題。

問題描述
在一個給定的二維矩陣中,考慮一個起點和終點。目標是找到一條從起點到終點的路徑,並避開障礙物。每一步都可以向上、向下、向左或向右移動。

演算法描述

  1. 定義一個解決方案矩陣,用於存儲從起點到終點的移動。
  2. 從起點開始,嘗試所有可能的移動。
  3. 如果某個移動到達終點,那麼路徑就被找到。
  4. 如果該點不能前進或該點已經被訪問,則退回到前一個點。
  5. 返回到第2步,直到找到路徑或該問題無解。

C++ 實現

#include<iostream>
#define N 4

bool solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N]);

void printSolution(int sol[N][N]) {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            std::cout << sol[i][j] << " ";
        std::cout << std::endl;
    }
}

bool isSafe(int maze[N][N], int x, int y) {
    return (x >= 0 && x < N && y >= 0 && y < N && maze[x][y] == 1);
}

bool solveMaze(int maze[N][N]) {
    int sol[N][N] = {{0}};

    if (!solveMazeUtil(maze, 0, 0, sol)) {
        std::cout << "Solution doesn't exist";
        return false;
    }

    printSolution(sol);
    return true;
}

bool solveMazeUtil(int maze[N][N], int x, int y, int sol[N][N]) {
    if (x == N - 1 && y == N - 1) {
        sol[x][y] = 1;
        return true;
    }

    if (isSafe(maze, x, y)) {
        sol[x][y] = 1;

        if (solveMazeUtil(maze, x + 1, y, sol))
            return true;
        if (solveMazeUtil(maze, x, y + 1, sol))
            return true;

        sol[x][y] = 0;
    }

    return false;
}

int main() {
    int maze[N][N] = {
        {1, 0, 0, 0},
        {1, 1, 0, 1},
        {0, 1, 0, 0},
        {1, 1, 1, 1}
    };

    solveMaze(maze);
    return 0;
}

這個程序首先初始化迷宮和解決方案矩陣。然後,它使用回溯方法,試圖找到從左上角到右下角的路徑。

總結
回溯法是一種通用的解決方案,適用於許多遊戲和數據結構問題。當正確地應用時,它可以提供高效且簡單的解決方案。


上一篇
佇列演算法:優先佇列
下一篇
遊戲AI 演算法:八皇后演算法
系列文
C++ AI 起步:編程進入智能世界32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言